/**
 * 
 */
package com.xjt.query.dao;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.xjt.exception.XjtSqlException;

/**
 * @author Jet Xu
 * <p>
 * namedParameterJdbcTemplate.query 在有参数的时候使用
 * </p>
 * <p>
 * namedParameterJdbcTemplate.getJdbcOperations().query 在没有参数的时候使用，应该等同于JdbcTemplate.query
 * </p>
 */
@Repository
public class CommonDao {

    /** jdbc操作模板 */
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    /**
     * @param namedParameterJdbcTemplate the namedParameterJdbcTemplate to set
     */
    @Resource(name = "namedParameterJdbcTemplate")
    public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
    }

    /**
     * 根据sql取得结果列表
     * 
     * @param sql
     * @param params
     * @param colList
     * @return
     * @throws XjtSqlException
     */
    public List<Map<String, Object>> queryForListWithSql(String sql, Map<String, Object> params, List<String> colList)
                                                                                                                      throws XjtSqlException {
        RowMapper<Map<String, Object>> rowMapper = new NameListRowMapper(colList);

        try {
            return this.namedParameterJdbcTemplate.query(sql, new MapSqlParameterSource(params), rowMapper);
        } catch (DataAccessException e) {
            throw new XjtSqlException(e);
        } catch (Exception e) {
            throw new XjtSqlException(e);
        }
    }

    /**
     * 根据sql取得结果(int)
     * 
     * @param sql
     * @return
     * @throws XjtSqlException
     */
    public int queryForIntWithSql(String sql, Map<String, Object> params) throws XjtSqlException {
        try {
            return this.namedParameterJdbcTemplate.queryForInt(sql, new MapSqlParameterSource(params));
        } catch (DataAccessException e) {
            throw new XjtSqlException(e);
        } catch (Exception e) {
            throw new XjtSqlException(e);
        }
    }
    //
    // /**
    // * 根据sql取得结果列表
    // *
    // * @param sql
    // * @param clz
    // * @return
    // * @throws DataAccessException
    // * @throws Exception
    // */
    // public <T > List<T> queryForList(String sqlid, Class<T> clz) throws XjtSqlException {
    // try {
    // return this.namedParameterJdbcTemplate.getJdbcOperations().query(getSqlById(sqlid),
    // new BeanPropertyRowMapper<T>(clz));
    // }
    // catch (DataAccessException e) {
    // throw new XjtSqlException(e);
    // }
    // catch (Exception e) {
    // throw new XjtSqlException(e);
    // }
    // }
    //
    // /**
    // * 根据sql取得结果列表
    // *
    // * @param cmd
    // * @param clz
    // * @return
    // * @throws DataAccessException
    // * @throws Exception
    // */
    // public <T > List<T> queryForList(ICommand<T> cmd, Class<T> clz) throws XjtSqlException {
    // if (null == cmd) {
    // return null;
    // }
    //
    // if (null == cmd.getBean()) {
    // return queryForList(cmd.getSqlId(), clz);
    // }
    //
    // try {
    // return this.namedParameterJdbcTemplate.query(getSqlById(cmd.getSqlId()),
    // new BeanPropertySqlParameterSource(cmd.getBean()), new BeanPropertyRowMapper<T>(clz));
    // }
    // catch (DataAccessException e) {
    // throw new XjtSqlException(e);
    // }
    // catch (Exception e) {
    // throw new XjtSqlException(e);
    // }
    // }
    //
    // /**
    // * 根据sql取得结果
    // *
    // * @param sql
    // * @param clz
    // * @return
    // * @throws DataAccessException
    // * @throws Exception
    // */
    // public <T > T queryForBean(String sqlid, Class<T> clz) throws XjtSqlException {
    // List<T> list = queryForList(sqlid, clz);
    //
    // if (CollectionUtils.isEmpty(list)) {
    // return null;
    // }
    //
    // return list.get(0);
    // }
    //
    // /**
    // * 根据sql取得结果
    // *
    // * @param cmd
    // * @param clz
    // * @return
    // * @throws DataAccessException
    // * @throws Exception
    // */
    // public <T > T queryForBean(ICommand<T> cmd, Class<T> clz) throws XjtSqlException {
    // List<T> list = queryForList(cmd, clz);
    //
    // if (CollectionUtils.isEmpty(list)) {
    // return null;
    // }
    //
    // return list.get(0);
    // }
    //
    // /**
    // * 更新记录
    // *
    // * @param cmd
    // * @return
    // * @throws XjtSqlException
    // */
    // public <T > int updateBean(ICommand<T> cmd) throws XjtSqlException {
    // if (null == cmd) {
    // return 0;
    // }
    //
    // try {
    // if (null == cmd.getBean()) {
    // return this.namedParameterJdbcTemplate.getJdbcOperations().update(getSqlById(cmd.getSqlId()));
    // }
    // else {
    // return this.namedParameterJdbcTemplate.update(getSqlById(cmd.getSqlId()),
    // new BeanPropertySqlParameterSource(cmd.getBean()));
    // }
    // }
    // catch (DataAccessException e) {
    // throw new XjtSqlException(e);
    // }
    // catch (Exception e) {
    // throw new XjtSqlException(e);
    // }
    // }
    //
    // /**
    // * 添加记录
    // *
    // * @param cmd
    // * @return
    // * @throws XjtSqlException
    // */
    // public <T > int insertBean(ICommand<T> cmd) throws XjtSqlException {
    // return this.updateBean(cmd);
    // }
    //
    // /**
    // * 批量添加
    // *
    // * @param sqlid
    // * @param list
    // * @return
    // * @throws XjtSqlException
    // */
    // public <T > int[] batchInsertBeans(String sqlid, List<T> list) throws XjtSqlException {
    // try {
    // BeanPropertySqlParameterSource[] batchArgs = new BeanPropertySqlParameterSource[list.size()];
    //
    // for (int i = 0; i < list.size(); i++) {
    // batchArgs[i] = new BeanPropertySqlParameterSource(list.get(i));
    // }
    //
    // return this.namedParameterJdbcTemplate.batchUpdate(getSqlById(sqlid), batchArgs);
    //
    // }
    // catch (DataAccessException e) {
    // throw new XjtSqlException(e);
    // }
    // catch (Exception e) {
    // throw new XjtSqlException(e);
    // }
    // }
    //
    // /**
    // * 删除记录
    // *
    // * @param cmd
    // * @return
    // * @throws XjtSqlException
    // */
    // public <T > int deleteBean(ICommand<T> cmd) throws XjtSqlException {
    // return this.updateBean(cmd);
    // }
    //
    // /**
    // * 根据SQLID取得对应的sql，如果没取得，则抛出异常
    // *
    // * @param sqlid
    // * @return
    // * @throws XjtSqlException
    // */
    // private String getSqlById(String sqlid) throws XjtSqlException {
    // // String sql = sqlConfigCache.getValue(sqlid);
    // //
    // // if (StringUtils.isEmpty(sql)) {
    // // throw new XjtSqlException("sqlid=" + sqlid + " does not exist!");
    // // }
    //
    // return null;
    // }

}
